import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties



# 设置中文字体，确保matplotlib可以正确显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体或者你系统上有的其他中文字体
plt.rcParams['axes.unicode_minus'] = False    # 解决负号 '-' 显示为方块的问题

# 加载数据并检查是否加载成功
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data"
columns = ['Class', 'Alcohol', 'Malic_acid', 'Ash', 'Alcalinity_of_ash', 'Magnesium',
           'Total_phenols', 'Flavanoids', 'Nonflavanoid_phenols', 'Proanthocyanins',
           'Color_intensity', 'Hue', 'OD280/OD315', 'Proline']
data = pd.read_csv(url, header=None, names=columns)
print("数据集大小:", data.shape)  # 打印数据集大小以确认数据已正确加载

# 筛选类别 1 和类别 2 的数据
filtered_data = data[data['Class'].isin([1, 2])]
X = filtered_data.iloc[:, 1:]  # 特征数据
y = filtered_data['Class']    # 标签数据

# PCA - 降维到二维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

print("PCA 降维后的二维特征：")
print(X_pca)

# LDA - 降维到一维
lda = LDA(n_components=1)  # 对于两类问题，LDA 降维后仅为一维
X_lda = lda.fit_transform(X, y)

print("LDA 降维后的一维特征：")
print(X_lda)

# 数据可视化
# 创建一个图形窗口用于同时展示PCA和LDA结果
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))

# PCA 可视化
scatter_pca = ax1.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k', s=50)
ax1.set_title('PCA: 降维到二维的散点图')
ax1.set_xlabel('主成分 1')
ax1.set_ylabel('主成分 2')
ax1.grid()

# LDA 可视化
scatter_lda = ax2.scatter(X_lda, [0] * len(X_lda), c=y, cmap='viridis', edgecolor='k', s=50)
ax2.set_title('LDA: 降维到一维的散点图')
ax2.set_xlabel('线性判别 1')
ax2.set_yticks([])  # 移除 y 轴刻度以提高清晰度
ax2.grid()

# 添加颜色条
plt.colorbar(scatter_pca, label='类别标签', ax=ax2)

# 显示图形
plt.tight_layout()
plt.savefig('pca_lda_visualization.png')  # 保存图像文件
plt.show()  # 如果在有图形界面的环境中运行，这将显示图像